/*
 * 작성자 : Jint
 * 작성일 : 140421
 * 내용 : Collection - ArrayList 여러 기능 실습 및 구현(Using JFrame). 
 */

package collection;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import java.awt.Color;

import javax.swing.JCheckBox;

public class ArrayListEx extends JFrame {

	private JPanel contentPane;
	private JTextField inputData;
	private JButton btnAdd;
	private JButton btnDel;
	private JButton btnMod;
	private JButton btnPrn;
	private JScrollPane scrollPane;
	private JTextArea result;
	private JButton btnSearch;
	int pos=-1;
	String saveStr="";
	
	
	
	ArrayList list = new ArrayList();
	private JButton btnClear;
	private JCheckBox cboxAll;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ArrayListEx frame = new ArrayListEx();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}				
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ArrayListEx() {
		setTitle("ArrayList Example");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 465, 424);
		contentPane = new JPanel();
		contentPane.setBackground(Color.PINK);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		contentPane.add(getInputData());
		contentPane.add(getBtnSearch());
		contentPane.add(getBtnAdd());
		contentPane.add(getBtnDel());
		contentPane.add(getBtnMod());
		contentPane.add(getBtnPrn());
		contentPane.add(getScrollPane());
		contentPane.add(getBtnClear());
		contentPane.add(getCboxAll());
	}
	private JTextField getInputData() {
		if (inputData == null) {
			inputData = new JTextField();
			inputData.setBounds(12, 10, 97, 21);
			inputData.setColumns(10);
		}
		return inputData;
	}
	private JButton getBtnSearch() {
		if (btnSearch == null) {
			btnSearch = new JButton("조회");
			btnSearch.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					//int pos = -1; // list 의 첫번째의 주소값이 0이기 때문에 초기화 값을 -1로 초기화해준다.
					// 수정과 삭제를 위한 pos값을 저장해준다.
					
					pos=-1;
					saveStr="";
					
					for(int i=0; i<list.size();i++){
						if(list.get(i).equals(inputData.getText())){
							pos=i;
							saveStr = (String)list.get(i);
							result.append("데이터 " + list.get(i) +" 가 검색되었습니다.\n");
							btnDel.setEnabled(true);
							btnMod.setEnabled(true);
							break;
						}
					}
					if(pos == -1){
						result.append("찾으시는 데이터가 없습니다.\n");
					}
					
					
					/*try{ // 몇번째의 데이터인지 검색하고 싶을때, 이 주석문을 사용하면 된다.
						if(Integer.parseInt(inputData.getText())>=0 && Integer.parseInt(inputData.getText())<=list.size()-1){
							result.append(Integer.parseInt(inputData.getText()) + "번째의 데이터는 " + list.get(Integer.parseInt(inputData.getText())) + " 입니다.\n");
							btnDel.setEnabled(true);
							btnMod.setEnabled(true);
							pos = Integer.parseInt(inputData.getText());
						}else{
							result.append("0 ~ " + (list.size()-1) + " 사이의 숫자만 입력해주세요.\n");						
						}
					}catch(Exception ex){
						result.append("0 ~ " + (list.size()-1) + " 사이의 숫자만 입력해주세요.\n");
					}					
					inputData.setText("");
					inputData.requestFocus();
					result.setCaretPosition(result.getText().length());*/					
				}
			});
			btnSearch.setBounds(121, 9, 97, 23);
		}
		return btnSearch;
	}
	private JButton getBtnAdd() {
		if (btnAdd == null) {
			btnAdd = new JButton("추가");
			btnAdd.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if(!inputData.getText().equals("")){
						list.add(inputData.getText());
						result.append("입력하신 "+inputData.getText()+" 추가 되었습니다.\n");
						result.append("현재까지 저장된 데이터의 갯수는 " +list.size()+  " 개 입니다.\n");
						inputData.setText("");
						inputData.requestFocus();
						result.setCaretPosition(result.getText().length());
					}else{
						result.append("공백은 추가할 수 없습니다.\n");
					}
					
				}
			});
			btnAdd.setBounds(12, 41, 97, 23);
		}
		return btnAdd;
	}
	private JButton getBtnDel() {
		if (btnDel == null) {
			btnDel = new JButton("삭제");
			btnDel.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					// ArrayList 는 하나가 삭제되면, 배열을 재정비하여 처음주소부터 다시 저장하게 된다.
					// for문 내의 변수 i를 0부터 시작하게 되면 0번째가 지워지고 1번째가 0번째로 저장되게 되는데 이때 i는 i++이 되어 1이므로 
					// 원래 1번자리에 있던 값이 삭제되지 않고 0번째로 내려가고 2번자리에 있던 값이 1번자리로 내려와 결론적으로 1번자리의 값은 지워지지 않게된다.
					// 따라서 삭제는 맨 뒤부터 하는것이 좋다.
					boolean cbox = cboxAll.isSelected();
					int cnt=0;
					if(pos>=0){
						if(cbox){
							for(int i=list.size()-1;i>=0;i--){
								if(list.get(i).equals(inputData.getText())){
									list.remove(i);
									cnt++;
								}								
							}
							result.append("데이터 : " +saveStr+" 이 " +cnt+ " 건 삭제되었습니다.\n");
							cboxAll.setSelected(false);
						}else{
							list.remove(pos);					
							result.append(pos + " 번째의 데이터"+saveStr+"가 삭제 되었습니다.\n");													
						}
						inputData.setText("");
						inputData.requestFocus();
						btnDel.setEnabled(false);
						btnMod.setEnabled(false);						
					}
					
					/*if(pos>=0 && cboxAll.isSelected()){
						for (int i=list.size()-1;i>=0;i--){
							list.remove(i);							
						}
						result.append("모든 데이터가 삭제 되었습니다.\n");
						btnDel.setEnabled(false);
						btnMod.setEnabled(false);
					}else if(pos>=0){
						list.remove(pos);					
						result.append(pos + " 번째의 데이터가 삭제 되었습니다.\n");
						inputData.setText("");
						inputData.requestFocus();
						
						btnDel.setEnabled(false);
						btnMod.setEnabled(false);
					}	*/				
				}
			});
			btnDel.setEnabled(false);
			btnDel.setBounds(121, 41, 97, 23);
		}
		return btnDel;
	}
	private JButton getBtnMod() {
		if (btnMod == null) {
			btnMod = new JButton("수정");
			btnMod.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					boolean cbox = cboxAll.isSelected();
					int cnt=0;
					if(pos>=0){
						if(cbox){
							for(int i=0;i<list.size();i++){
								if(list.get(i).equals(saveStr)){
									list.set(i, inputData.getText());
									result.append(i + " 번째의 데이터가" + inputData.getText() +" 으로 수정 되었습니다.\n");
									cnt++;
								}
							}
							result.append("총 " + cnt +" 번 수정 되었습니다.\n");
							cboxAll.setSelected(false);
						}else{
							list.set(pos, inputData.getText());							
							result.append(pos + " 번째의 데이터가" + inputData.getText() +" 으로 수정 되었습니다.\n");
						}
						inputData.setText("");
						inputData.requestFocus();
						btnDel.setEnabled(false);
						btnMod.setEnabled(false);
					}
					
					
					
					
					/*if(pos>=0 && cboxAll.isSelected()){ // 전체 데이터를 내가 원하는 값으로 수정
						for (int i=0;i<list.size()-1;i++){
							list.set(i, inputData.getText());							
						}
						result.append("모든 데이터가" + inputData.getText() +" 으로 수정 되었습니다.\n");
						btnDel.setEnabled(false);
						btnMod.setEnabled(false);
					}else if(pos>=0){
						list.set(pos, inputData.getText());
						
						result.append(pos + " 번째의 데이터가" + inputData.getText() +" 으로 수정 되었습니다.\n");
						
						inputData.setText("");
						inputData.requestFocus();
						btnDel.setEnabled(false);
						btnMod.setEnabled(false);	
					}*/
				}
			});
			btnMod.setEnabled(false);
			btnMod.setBounds(230, 41, 97, 23);
		}
		return btnMod;
	}
	private JButton getBtnPrn() {
		if (btnPrn == null) {
			btnPrn = new JButton("출력");
			btnPrn.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n==========데이터 목록==========\n");
					for(int i=0;i<list.size()-1;i++){
						result.append( i+1 +"번째의 데이터는 : " + list.get(i) + " 입니다.\n");
					}
					result.setCaretPosition(result.getText().length());
				}
			});
			btnPrn.setBounds(339, 41, 97, 23);
		}
		return btnPrn;
	}
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setBounds(12, 74, 424, 302);
			scrollPane.setViewportView(getResult());
		}
		return scrollPane;
	}
	private JTextArea getResult() {
		if (result == null) {
			result = new JTextArea();
		}
		return result;
	}
	
	private JButton getBtnClear() {
		if (btnClear == null) {
			btnClear = new JButton("Clear");
			btnClear.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.setText("");
				}
			});
			btnClear.setBounds(339, 9, 97, 23);
		}
		return btnClear;
	}
	private JCheckBox getCboxAll() {
		if (cboxAll == null) {
			cboxAll = new JCheckBox("All");
			cboxAll.setBounds(230, 9, 97, 23);
		}
		return cboxAll;
	}
}
